[ Home ] [ News ] [ Contact ] [ Search ]

 ==> Download Software
 nextnano³ documentation

 Copyright notice
 About us
 Useful Links
 Publications
 
 * password protected

 

 
 

Polarization induced charges

After the strain distribution has been calculated, the strain tensor in the crystal system can be obtained by the subroutine get_strain_tensor_cxyz for each point on material grid.
On this basis, one can provide the piezoelectric polarization vector for each of these points.
The pyroelectric polarization is implemented in a similar was. However, it is independent of strain.

This is done in MODULE input_block_four:

  •  subroutine get_pyroelectricity(i,PolV)
    !-----------------------------------------------------------------------------
    !
    Provides for point number i on
    material grid
    !
    the polarization vector in coordinates of simulation region.
    !
    Units: C/m^2
    ! 1D: PolV(1)   =
    component of polarization vector in simulation direction
    ! 2D: PolV(1:2) =
    component of polarization vector (Px,Py)
    ! 3D: PolV(1:3) =
    component of polarization vector (Px,Py,Pz)
    !-----------------------------------------------------------------------------

        vector = sp_polar_xyz(mnu,x)        -->
    get the vector in xyz system
    1D: compV  = mask_domain_to_xyz(1)
    2D: compV  = mask_domain_to_xyz(1:2)    --> mask_domain_to_xyz
    says which is the
                                               
    simulation_x, simulation_y axis:
                                                mask_domain_to_xyz(1) -->
    x_axis in simulation
                                                                  (2) -->
    y_axis in simulation
    3D: compV  = mask_domain_to_xyz(1:3)    --> mask_domain_to_xyz
    says which is the
                                               
    simulation_x, simulation_y, simulation_z axis
                                                mask_domain_to_xyz(1:3) = (1 2 3)
                                                -------- CHECK -------------
    1D: PolV =     vector(compV)            --> polarization vector in simulation system
    2D: PolV = (/ (vector(compV(k)) , k=1,2) /)
    3D: PolV = (/ (vector(compV(k)) , k=1,3) /)
  •  subroutine get_piezoelectricity(i,PolV)
    !-----------------------------------------------------------------------------
    !
    Provides for point number i on Güenther's grid
    !
    the polarization vector in coordinates of simulation region.
    !
    Units: C/m^2
    ! 1D: PolV(1)   =
    component of polarization vector in simulation direction
    ! 2D: PolV(1:2) =
    component of polarization vector (Px,Py)
    ! 3D: PolV(1:3) =
    component of polarization vector (Px,Py,Pz)

Polarization charges are calculated according to  - div vec P = charge.
They are stored in MODULE polarizations.

!----------------------------------------------------------------------------------
 MODULE polarizations
!----------------------------------------------------------------------------------
!
!
Pyroelectricity:
!
! background_pyroV    (1..lengvecV)                -->
For graded regions, e.g. ternaries with
!                                                      linear alloy profile.
!                                                     
Only different from zero for single points.
!                                                     
Also defined for multiple points.
!                                                     
Units: C/m^3
! 1D: interface_pyro1DV(1..num_mult_points)        --> Interface charge due to
! 2D: interface_pyroV  (1..num_mult_points,1:4)        pyroelectricity in SI units [C/m^2].
! 3D: interface_pyroV  (1..num_mult_points,1:12)
!
! 1D: boundary_pyro1DV  (1:2)                      --> The same at boundary.
!     boundary_pyroV does not exist in 2D/3D.
!
!
!
Piezoelectricity:
!
! background_piezoV   (1..lengvecV)                -->
For graded regions, e.g. ternaries with
!                                                      linear alloy profile.
!                                                     
Only different from zero for single points.
!                                                     
Also defined for multiple points.
!                                                     
Units: C/m^3
! 1D: interface_piezo1DV(1..num_mult_points)       --> Interface charge due to
! 2D: interface_piezoV  (1..num_mult_points,1:4)       piezoelectricity in SI units [C/m^2].
! 3D: interface_piezoV  (1..num_mult_points,1:12)
!
! 1D: boundary_piezo1DV (1:2)                      --> The same at boundary.
!     boundary_piezoV does not exist in 2D/3D.
!
!----------------------------------------------------------------------------------

 

 REAL(8),DIMENSION(2)           :: boundary_pyro1DV   ! 1D only
 REAL(8),DIMENSION(2)           :: boundary_piezo1DV  ! 1D only

 REAL(8),DIMENSION(:)  ,POINTER :: interface_pyro1DV  ! 1D only
 REAL(8),DIMENSION(:)  ,POINTER :: interface_piezo1DV ! 1D only

 REAL(8
),DIMENSION(:,:),POINTER :: interface_pyroV    ! 2D/3D only
 REAL(8),DIMENSION(:,:),POINTER :: interface_piezoV   ! 2D/3D only

 REAL(8
),DIMENSION(:)  ,POINTER :: background_pyroV   ! 1D/2D/3D
 REAL(8),DIMENSION(:)  ,POINTER :: background_piezoV  ! 1D/2D/3D

 

Note:

In a general 3D simulation the program gets the polarization vectors of all eight octants:
There are 12 (3D) internal interfaces between these 8 octants.
In case there is an interface, a corresponding interface charge is set: interface_pyroV,interface_piezoV
In case there is no interface a corresponding volume charge is set: background_pyroV,background_piezoV
The sum of the volume charges of ALL octants is written to  background_pyroV(adr), where adr is the position of the FIRST octant on Stefan's grid: adr=adresse_3DM(i,j,k)

Note:

On domain boundaries the box is assumed to be mirrored to the outer region, so the polarization vectors across domain boundaries are assumed to be equal, so no surface charges are set.
--> boundary_pyroV, boundary_piezoV do not exist in 2D/3D
(In 1D they exist but do not make sense due to our convention --> set to zero.)

 

Internal details:

 !------------- mapping ---------------------------------------------
 !
 ! mapping
contains for each interface sigma_1..12
 !
which octants are involved mapping(i,1) --> octant1
 !                            (i,2) --> octant2
 !
 !
and which component of polarization vector is relevant
 !                     mapping(i,3) =1 -->
x-component
 !                                  =2 -->
y-component
 !                                  =3 -->
z-component
 !-------------------------------------------------------

 ! sigma_1
  mapping( 1,1)=1            -->
interface 1 is the interface between octant 1 and 5
  mapping( 1,2)=5               
the normal vector of this interface is the z-axis, so
  mapping( 1,3)=3               
the relevant component of the polarization vector is 3

 ! sigma_2
  mapping( 2,1)=2 ! octant2
  mapping( 2,2)=6 ! octant6
  mapping( 2,3)=3 ! z-component

 ! sigma_3
  mapping( 3,1)=3 ! octant3
  mapping( 3,2)=7 ! octant7
  mapping( 3,3)=3 ! z-component

 ! sigma_4
  mapping( 4,1)=4 ! octant4
  mapping( 4,2)=8 ! octant8
  mapping( 4,3)=3 ! z-component

 ! sigma_5
  mapping( 5,1)=1
  mapping( 5,2)=3
  mapping( 5,3)=2 ! y-component

 ! sigma_6
  mapping( 6,1)=2
  mapping( 6,2)=4
  mapping( 6,3)=2 ! y-component

 ! sigma_7
  mapping( 7,1)=5
  mapping( 7,2)=7
  mapping( 7,3)=2 ! y-component

 ! sigma_8
  mapping( 8,1)=6
  mapping( 8,2)=8
  mapping( 8,3)=2 ! y-component

 ! sigma_9
  mapping( 9,1)=1
  mapping( 9,2)=2
  mapping( 9,3)=1 ! x-component

 ! sigma_10
  mapping(10,1)=3
  mapping(10,2)=4
  mapping(10,3)=1 ! x-component

 ! sigma_11
  mapping(11,1)=5
  mapping(11,2)=6
  mapping(11,3)=1 ! x-component

 ! sigma_12
  mapping(12,1)=7
  mapping(12,2)=8
  mapping(12,3)=1 ! x-component

 !---------------------------------------------------------------------------

In 2D the mapping is as follows:

 !------------- mapping ---------------------------------------------
 !
 ! mapping
contains for each interface sigma_1..4 (i=sigma_1..4)
 !
which octants are involved mapping(i,1) --> octant1
 !                            (i,2) --> octant2
 !
 !
and which component of polarization vector is relevant
 !                     mapping(i,3) = 1 -->
x-component
 !                                  = 2 -->
y-component
 !
 !                       |
 !                       |
 !                    sigma_3
 !                       |
 !       octant3         |       octant4
 !                       |
 !                       |
 !   ----sigma_2-----------------sigma_4----
 !                       |
 !                       |
 !       octant1         |       octant2
 !                       |
 !                    sigma_1
 !                       |
 !                       |
 !
 !-------------------------------------------------------

 ! sigma_1
  mapping(1,1)=1 ! octant1
  mapping(1,2)=2 ! octant2
  mapping(1,3)=1 ! x-component

 ! sigma_2
  mapping(2,1)=1 ! octant1
  mapping(2,2)=3 ! octant3
  mapping(2,3)=2 ! y-component

 ! sigma_3
  mapping(3,1)=3 ! octant3
  mapping(3,2)=4 ! octant4
  mapping(3,3)=1 ! x-component

 ! sigma_4
  mapping(4,1)=2 ! octant2
  mapping(4,2)=4 ! octant4
  mapping(4,3)=2 ! y-component

!---------------------------------------------------------------------------

The problem is complicated at contacts which are defined by Poisson clusters.
The polarization charges at interfaces from a pyroelectric material (say GaN) to a metal contact are very large.

At contacts, however, one has specific contact models (i.e. ohmic --> field = 0), so one does not want to have interface charges there.
 --> The subroutine interface_to_poisson_clstr removes these interface charges, in detail:

It loops through all multiple points and checks for each octant if it is contained in a Poisson cluster.
Then it loops through all 12 internal interfaces and if at least one of the adjoining octants belongs to a Poisson cluster this interface charge (pyro and piezo) is set to zero.

Note the $numeric-control specifiers (see there for details):
- piezo-charge-at-boundaries
-  pyro-charge-at-boundaries
- piezo-constants-zero
-  pyro-constants-zero

   
Last modified: 09-Jun-2011