-
Notifications
You must be signed in to change notification settings - Fork 38
Description
When computing phonons in insulators, its phonon dispersion can be interpolated properly only when accounting for the so-called non-analytical constants, i.e. the Born effective charges and dielectric tensors.
These tensors are not as easy to compute as with pure phonon modes, as they require derivatives with respect to a (macroscopic) electric field. As for phonons, such tensors can be still computed via finite difference, or via linear-response (e.g. DFPT).
This opens the question to how to integrate the workflow(s) to compute these quantities. As this should be common, the possibilities are the following:
- Linear response, such as density functional perturbation theory. Requires a dedicated code, different from the simple SCF.
- Finite difference of the polarization: requires a code able to calculate the electronic polarization using the modern theory of polarization (i.e. Berry phase formalism). Nevertheless, this method is out of reach for the dielectric tensor.
- Finite differences upon application of a macroscopic electric field. Requires a code able to account for a macroscopic electric field using the modern theory of polarization. This IS NOT THE SAME as a sawtooth potential! (it would not work for solids)
Some thoughts on common interface:
- Having all the codes implementing only one method to be called?
- Implementing common workflows using the above mentioned methods? And then a "master" common interface to choose between linear-response method (if available) and finite differences (in principle only electric field)?
- It might be that some codes already have some of these workflows implemented (for finite differences, maybe VASP?).
- Ask developers to develop their own workflow for compute these properties, with one or more methods.
Regarding the common workflow using the electric field, some specifications could be, along the way of frozen phonons:
spec.input_namespace("central_difference")
spec.inputs("central_difference.electric_field_step") # the finite size step for numerical derivatives
spec.inputs("central_difference.accuracy") # how many points to use for numerical derivatives
spec.input_namespace("symmetry") # symmetry related input for reducing the amount of calculations, as in frozen phononsSome specifications can become more "user-friendly", but this is the idea.