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 parameterenable_optimization_stop_file
is not used. Default: A defaultOptimizeGeometryParameters
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)
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].