Ab initio computed vibrational frequencies of a mineral, at different cell volumes, are used for temperature estimation of a body whose IR spectrum has been recorded, within the framework of the Quasi-Harmonic Approximation (QHA)
It is advised to follow the tutorials Basic Eos and Dealing with the frequencies to learn the basics of the package usage.
The first command assures that graphical output is plot directly in the notebook:
%matplotlib inline
Start the program in the notebook. The example refers to the case of pyrope, for which a folder containing all the required ab initio data (static energies and frequencies as function of the unit cell volume) must be present, together with an input.txt file:
%run bm3_thermal_2.py
Suppose that the chosen mode for the investigation is the n. 85 (this is one of the most intense mode in the IR spectrum). Check how its frequency changes with the unit cell volume. Since a polynomial fit has been chosen (from the input.txt file, with the keyword POLY under FITVOL), use the function check_poly:
check_poly(81)
To check for consistency of the ab initio data, compute the equation of state at 300K (3^rd order Birch-Murnaghan EoS), and compare the result with the experimental bulk modulus:
eos_temp(300, prt=False)
For subsequent computations it is advised to keep Kp fixed to the values optimized at 300K (Kp = 4.67)
set_fix(4.67)
The current settings can be printed at any time by using the info.show command:
info.show()
Within the limits of QHA, frequencies do change with T due to thermal expansion: as T increases, the cell volume also increases (generally) and frequencies change accordingly as an effect of the volume variation. Check the thermal expansion at 300K, by using the command thermal_exp_p; to have a description of this command, just type:
help(thermal_exp_p)
thermal_exp_p(300,0)
Compute the frequency of the mode n. 85 at 300K:
help(freq_poly_p)
freq_poly_p(81, 300, 0)
So, the frequency of that mode, at T=300K (and P=0 GPa) is 858.86 cm^-1. To check the reliability of the code and the possible error on the temperature estimation due to the fits, use the function temperature_freq, whose description is:
help(temperature_freq)
temperature_freq(81, 858.86, 200, 400, 12, 0, degree=3)
By providing exactly the value of 858.96 cm^-1 as input to the function temperature_freq, the returned value for T is 299.93 which is very close to the actual value of 300K. We can conclude that the error on the temperature estimation (due to the fitting procedure only) is in this case less than 0.1K.
Suppose that the value of the measured frequency is 855.5 cm^-1; the temperature estimation is:
temperature_freq(81, 855.5, 200, 600, 12, 0, degree=3)