Elastic Constants
Learning Objectives
- Use Andrew Walker and Dan Wilson's python scripts for computing elastic constants.
Introduction
Andrew Walker (building on work by Dan Wilson) provides some python scripts for calculating elastic constants using CASTEP, available from https://github.com/andreww/elastic-constants. The tool comes in two parts - first is generate_strain.py
, this takes the results of a successful variable cell geometry optimisation and creates a set of input files to be run through CASTEP. The second part is elastics.py
, which takes the CASTEP results and constructs the matrix of elastic constants, Young's modulus, Poisson's ratios and bulk and shear moduli. Usage information for each script can be obtained by using the --help
option.
Exercise
For this exercise we will use rutile titanium dioxide. Below are example .cell
and .param
files to start from. It is assumed that the scripts generate_strain.py
and elastics.py
are in your PATH
and that python is installed.
Task 1: Perform a variable cell geometry optimisation and make sure to include calculate_stress : true
in your param
file. Test the kinetic energy cut-off and k-point grid such that the stress is converged to within the default geom_stress_tol
value. (Hint: Use CASTEP's built-in help utility to find the default.)
Task 2: Use the generate_strain.py
script to generate a set of .cell
files deformed according to the appropriate strain pattern. The command "generate_strain.py TiO2
" should be sufficient.
You should now have twelve (in this case) sets of input files - individual .cell
files and corresponding .param
, symbolically linked to the original TiO2.param file. Notice that the new .cell
files all have the "FIX_ALL_CELL true
" option set.
Task 3: Run CASTEP on each of the 12 sets of input files. Note that the cell distortions can break the symmetry of the crystal, hence changing the number of k-points in the symmetry reduced sample. The "-dryrun
" option of CASTEP can be used to do a quick check for how many k-points are required. This can help when selecting how many cores to run the calculation on if you are running CASTEP in parallel.
Task 4: Run the elastics.py
script to obtain the elastic constants. The command "elastics.py TiO2
" will print the results to the terminal. The "--latex
" option generates a LaTeX formatted summary of the results and the "--graphics
" option produces a graphical representation of the stress-strain fits in a .png
file.
Task 5: Investigate how the results and their errors change with smaller values of the elec_energy_tol
parameter. Also investigate the effect of changing the --strain
option to generate_strain.py
. Move any old *cij*.castep
files to another directory - the elastics.py
script only checks the first set of data in a concatenated .castep
file.
Example Input Files
TiO2.cell
%BLOCK lattice_cart 4.594 0.000 0.000 0.000 4.594 0.000 0.000 0.000 2.959 %ENDBLOCK lattice_cart %BLOCK positions_frac Ti 0.000 0.000 0.000 Ti 0.500 0.500 0.500 O 0.305 0.305 0.000 O -0.305 -0.305 0.000 O 0.805 0.195 0.500 O -0.805 -0.195 0.500 %ENDBLOCK positions_frac symmetry_generate kpoint_mp_grid 3 3 3
TiO2.param
task : geometryoptimisation cutoff_energy : 700 eV xc_functional : PBE max_scf_cycles : 100 calculate_stress : true opt_strategy : speed num_dump_cycles : 0