Poisson block (solve Poisson problem)
SUBROUTINE
poisson_block
solves the Poisson problem.
When called, this subroutine solves the Poisson
problem for the Fermi levels given in MODULE
fermi_level.
The solution is written to
phiV in MODULE
potentials.
This subroutine is mainly steered by the following
variables in MODULE
control_poisson:
built_inL = .TRUE. --> The routine poisson_block
calculates the built-in potential.
.FALSE. --> The routine poisson_block calculates the
potential;
the built-in potential is assumed to exist in
BuiltInPotentialV in MODULE potentials.
classL = .TRUE. -->
The routines poisson_block and
solve_current_problem
(solve_current_problem1D)
calculate the potentials assuming a pure classical treatment.
.FALSE. --> The routines poisson_block and
solve_current_problem
(solve_current_problem1D)
calculate the potentials
as specified in input file.
The subroutine can be split into three parts:
1. Define Poisson problem
2. Solve nonlinear Poisson equation
3. Deallocate Poisson clusters and arrays
1. Define Poisson problem
First define poisson Problem.
CALL define_poisson_clusters
CALL poissonmatrix3D
CALL set_dirichlet_poisson
CALL
scale_poisson
Here the Poisson matrix is defined. First, all
information about boundary conditions (Poisson clusters) is allocated [CALL
define_poisson_clusters].
Then the Poisson matrix is set up [CALL poissonmatrix3D].
Finally, Dirichlet boundary conditions are defined [CALL set_dirichlet_poisson].
In 1D the Poisson problem is scaled by 1.
In 3D and 2D the Poisson problem is scaled, as
described in MODULE
numeric_control:
Linear Poisson:
------------
Note: Using SI system has the effect that
in equation
PoissonM * xV = bV
both sides (i.e. PoissonM
and bV) are scaled by a factor
about 10-22 in 3D (2D: 10-12).
We have noticed that the conjugate gradient method
in templates does not work well within that regime.
Therefore both sides are scaled by a factor scale_poisson.
To be specific, all elements of PoissonM
and bV are scaled AFTER
definition of Dirichlet boundary conditions in subroutine
scale_poisson.
scale-poisson = 1.0d18
has been proved to
be adequate in 3D (2D: 1.0d9).
This value should not be altered but can be
specified in
$numeric-control.
2. Solve nonlinear Poisson equation
IF (classL) THEN
CALL non_linear_poisson('class') ! classical
Poisson equation
ELSE
CALL non_linear_poisson('fully') !
quantum-mechanical Schrödinger-Poisson equation
END IF
3. Deallocate Poisson clusters and arrays
CALL
deallocate_poisson
When leaving poisson_block, all
arrays and pointers which have been allocated in the meantime, are
deallocated. So the allocation status is the
same as before.
OBJECT: Poisson Block
This program part considers the quasi Fermi levels in the module 'fermi_level' as being fixed and solves for this the
Schrödinger and Poisson equation self-consistently. The potential in the module
'potentials' is being adjusted
correspondingly.
More details are available on how to
solve the
Poisson problem.

OBJECT: Define Poisson Problem
More details are available on how to
setup the
Poisson problem.

OBJECT: Nonlinear Poisson
More details are available for the
nonlinear Poisson equation.

OBJECT: Deallocate Poisson
|