Source code for defermi.elasticity

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Elastic defect properties
"""

import numpy as np
import pandas as pd
import matplotlib



[docs] def get_elastic_dipole_tensor(stress_defect,stress_bulk,bulk_volume,corrections={}): """ Calculate elastic dipole tensor from stresses. Parameters ---------- stress_defect : np.array Stresses from defect calculation in kbar (VASP output) stress_bulk : np.array Stresses from bulk calculation in kbar (VASP output) bulk_volume : float Cell volume of bulk calculation in A°^3. corrections : bool Add correction terms to the residual stress tensor. Returns ------- dipole_tensor : np.array Elastic dipole tensor in eV. """ res_stress = np.array(stress_defect) - np.array(stress_bulk) dipole_tensor = -1*bulk_volume*res_stress #sign is inverted with respect to VASP output dipole_tensor += sum([v for k,v in corrections.items()]) return dipole_tensor
[docs] def get_relaxation_volume(stress_defect,stress_bulk,bulk_modulus,bulk_volume,corrections={}): """ Calculate relaxation volume from stresses. Parameters ---------- stress_defect : np.array Stresses from defect calculation in kbar (VASP output) stress_bulk : np.array Stresses from bulk calculation in kbar (VASP output) bulk_volume : float Cell volume of bulk calculation in A°^3. bulk_modulus : float Bulk modulus in GPa. corrections : bool Add correction terms to the residual stress tensor. Returns ------- rel_volume : float Relaxation volume in A°^3. """ bulk_modulus = bulk_modulus*10 # from GPa to kbar dipole_tensor = get_elastic_dipole_tensor( stress_defect=stress_defect, stress_bulk=stress_bulk, bulk_volume=bulk_volume, corrections=corrections) pressure = np.trace(dipole_tensor)/3 rel_volume = pressure/bulk_modulus return rel_volume