In this tutorial we will see a first example of self-consistent calculation of two simulation models, in this case Poisson (model driftdiffusion) and Schroedinger (models efaschroedinger and quantumdensity) equations. In this way, we will calculate the classical and quantum charge density in a AlGaAs /GaAs quantum well.
The following files should be present in the working directory:
The structure is as follows:
Region well
{
material = GaAs
doping = 1e15
doping_type = donor
doping_level = 0.025
}
We define a quantum Cluster which comprises the well region and two regions beside it
Cluster Quantum_1
{
mesh_regions = (well ,barrier1_q, barrier2_q )
}
We define the simulations:
model efaschroedinger
{
options
{
simulation_name = quantum_el
physical_regions = Quantum_1
}
}
dens_el (quantumdensity model) for the calculation of quantum electron charge density.
model quantumdensity
{
options
{
simulation_name = dens_el
physical_regions = Quantum_1
}
}
Let's see first how to set the quantum simulations to get the quantum charge density, then we'll see how to implement a self consistent cycle between the quantum charge and the classical 'Poisson' charge.
To solve Schroedinger equation in the quantum regions we set quantum_el simulation in this way:
particle = el), the number_of_eigenstates (22) to be calculated, and the poisson and strain simulations to be associated to quantum_el (poisson_model_name = dd, strain_model_name = macrostrain):
quantum_el
{
Dirichlet_bc_everywhere = false
particle = el
number_of_eigenstates = 22
poisson_model_name = dd
strain_model_name = macrostrain
convergent_density = true
}The default solver is used in this case.
quantum_el
{
model = conduction_band
}
To calculate quantum electron charge density, we set the parameters for the simulation dens_el (quantum density model):
In Solver section we can select:
quantum_simulation = quantum_elanalytic = true analytic = false, parameters for k-space integration, such as number_of_nodes of the k-space mesh, are needed :
dens_el
{
.....................
k_space_dimension = 2
k-space_basis = true
k1 = (0, 0, 0.1)
k2 = (0, 0.1, 0)
number_of_nodes = (4,4)
wedge = quarter
refine_fraction = 0.20
relative_accuracy = 0.01
refine_k_space = true
uniform_refinement = false
mesh_order = FIRST
initial_eigenstates_number = 10 #20
analytic = false
.....................................
We can choose to calculate charge density:
coupling = poisson for driftdiffusion model and we run only simulation dd Let's see in particular how to set a self-consistent calculation:
$Physics
{
driftdiffusion
{
electron_quantum_density = dens_el
use_density_predictor = true
....................
Selfconsistent
{
poisson_schroedinger
{
simulations = (dens_el, dd)
max_iterations = 10
abs_tolerance = 1e-4
rel_tolerance = 1e-6
}
}
Here, we select which simulations have to be run in a self-consistent cycle called poisson_schroedinger: simulations = (dd,dens_el);
besides, we set the tolerances.
Last step is to specify the selfconsistent cycle poisson_schroedinger in the solve declaration:
$Simulation
{
solve = (str, dd, poisson_schroedinger)
To summarize, we have three possible choices for our calculations:
solve = (str, poisson_schroedinger ) will solve, after strain, Poisson and quantum selfconsistentlysolve = (str,dd, dens_el) will solve, after strain, Poisson problem and then will calculate the quantum density without any self-consistencysolve = (str, dd) will just solve, after strain, Poisson and will terminate.tibercad quantum_poisson.tib
Quntum density has been calculated, in this case, with the analytical model (a parabolic parallel dispersion is considered), by setting analytic = true in Solver section.
Let's see now what happens if we set analytic = false: in this case an integration in k-space is performed for each calculation of the quantum density.
| Attachment | Size |
|---|---|
| quantum_poisson.tib | 3.05 KB |
| quantum_poisson.geo | 591 bytes |
| quantum_poisson.msh | 15.59 KB |