PiezoelectricTensor

class PiezoelectricTensor(configuration, kpoints_a=None, kpoints_b=None, kpoints_c=None, optimize_geometry=None, optimize_geometry_parameters=None, strain=None, symmetrize=None)

Class for calculating the piezoelectric tensor of a configuration.

Parameters:
  • configuration (BulkConfiguration) – The configuration with attached calculator that supports berry-phase polarization calculations.

  • kpoints_a (sequence (size 3) of int | MonkhorstPackGrid | KpointDensity) – The k-point sampling to use for integrating along the first direction.
    Default: The Monkhorst-Pack grid used for the self-consistent calculation.

  • kpoints_b (sequence (size 3) of int | MonkhorstPackGrid | KpointDensity) – The k-point sampling to use for integrating along the second direction.
    Default: The Monkhorst-Pack grid used for the self-consistent calculation.

  • kpoints_c (sequence (size 3) of int | MonkhorstPackGrid | KpointDensity) – The k-point sampling to use for integrating along the third direction.
    Default: The Monkhorst-Pack grid used for the self-consistent calculation.

  • optimize_geometry (bool) – Boolean to control if the internal coordinates should be optimized during strain.
    Default: False.

  • optimize_geometry_parameters (OptimizeGeometryParameters) – The parameters for the geometry optimization. Note that the parameter enable_optimization_stop_file is not used.
    Default: A default OptimizeGeometryParameters object.

  • strain (float) – The magnitude of the strain to be applied.
    Default: 0.01

  • symmetrize (bool) – Whether to calculate the symmetrized piezoelectric tensor. The symmetries used are those of the input configuration.
    Default: True

evaluate()

The piezoelectric tensor \(d_{kij}\) is returned as PhysicalQuantity array of shape (6, 3). Column k contains the values (\(d_{kxx}\), \(d_{kyy}\), \(d_{kzz}\), \(d_{kyz}\), \(d_{kxz}\), \(d_{kxy}\)) where k is 0 for x, 1 for y, and 2 for z.

Returns:

The piezoelectric tensor.

Return type:

PhysicalQuantity of type charge per area

metatext()
Returns:

The metatext of the object or None if no metatext is present.

Return type:

str | None

nlprint(stream=None)

Print a string containing an ASCII table useful for plotting the AnalysisSpin object.

Parameters:

stream (python stream) – The stream the table should be written to.
Default: NLPrintLogger()

setMetatext(metatext)

Set a given metatext string on the object.

Parameters:

metatext (str | None) – The metatext string that should be set. A value of “None” can be given to remove the current metatext.

symmetrize()
Returns:

Whether the tensor is symmetrized.

Return type:

bool

uniqueString()

Return a unique string representing the state of the object.

Usage Examples

Calculate the PiezoelectricTensor of GaAs in a simple cubic unit cell:

# -------------------------------------------------------------
# Bulk configuration
# -------------------------------------------------------------

# Set up lattice
lattice = SimpleCubic(5.6537*Angstrom)

# Define elements
elements = [Arsenic, Arsenic, Gallium, Gallium, Arsenic, Arsenic, Gallium,
            Gallium]

# Define coordinates
fractional_coordinates = [[ 0.75,  0.25,  0.75],
                          [ 0.25,  0.75,  0.75],
                          [ 0.5 ,  0.  ,  0.5 ],
                          [ 0.  ,  0.5 ,  0.5 ],
                          [ 0.25,  0.25,  0.25],
                          [ 0.75,  0.75,  0.25],
                          [ 0.  ,  0.  ,  0.  ],
                          [ 0.5 ,  0.5 ,  0.  ]]

# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(5, 5, 5),
    )

calculator = LCAOCalculator(
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    )

bulk_configuration.setCalculator(calculator)
nlprint(bulk_configuration)
bulk_configuration.update()

# -------------------------------------------------------------
# Piezoelectric tensor
# -------------------------------------------------------------
piezoelectric_tensor = PiezoelectricTensor(
    configuration=bulk_configuration,
    kpoints_a=MonkhorstPackGrid(20,5,5),
    kpoints_b=MonkhorstPackGrid(5,20,5),
    kpoints_c=MonkhorstPackGrid(5,5,20),
    )

nlprint(piezoelectric_tensor)

piezo_GaAs.py

The output from the calculation is:

+------------------------------------------------------------------------------+
| Piezoelectric Tensor Report                                                  |
+------------------------------------------------------------------------------+
|                                                                              |
| Tensor in units of [C/m**2]:                                                 |
|                                                                              |
|           x              y              z                                    |
| xx    7.22801e-20   -7.25228e-20    0.00000e+00                              |
| yy    0.00000e+00    7.22801e-20   -7.22801e-20                              |
| zz   -7.22801e-20   -1.41172e-22    7.22801e-20                              |
| yz   -8.15246e-01   -8.82326e-24    8.82326e-24                              |
| xz    1.10291e-23   -8.15246e-01   -1.21320e-23                              |
| xy   -8.82326e-24    8.82326e-24   -8.15246e-01                              |
|                                                                              |
+------------------------------------------------------------------------------+

Notes

Due to the symmetry of the zinc-blende structure, only the shear components are non-zero. As an example, an xy-shear strain (bottom line) leads to a polarization in the z-direction (rightmost column), and likewise the yz- and xz-shear strains are non-zero.

  • The calculated quantity is the proper piezoelectric tensor, as defined in ref. [1].

  • In the example above, the piezoelectric tensor is calculated assuming homogeneous strains. This is sometimes called the clamped-ion piezoelectric tensor. The experimental tensor will also have a contribution from internal strains, i.e. a relative displacement of the Ga sublattice to the As sublattice. This contribution can be included by setting the parameter optimize_geometry to True.

  • The calculated value of \(-0.82 C/m^2\) compares well with previous calculations Ref. [2].