Calculation of thermal expansion

Update of 03/09/2021

New functions and new ways to compute thermal expansion as a function of temperature are implemented in the current release of the program; in addition, new classes are implemented to set several parameters controlling the numerical evaluation of derivatives with respect to the volume and temperature. In particular, have a check to the documentation of the classes

on the index section of the site.

This page illustrates the new features working on the data for pyrope.

Let's load and run the program in the usual way:

In order to compute thermal expansion, four methods can be used. Two of them compute the cell volume (V) in a specified range of temperature (T); the logarithm of the V's are then computed and the log(V)/T values are fitted by using a polynomial function or a spline. The last step is to compute the first derivative of the fit to get the thermal expansion $\alpha$ from its definition:

$$\alpha(T) = \frac{d \log(V)}{d T} = \frac{1}{V} \frac{d V}{d T}$$

The two methods following this strategy differ by the functions used to get the cell volume at each temperature: one method uses the volume_dir function; the second one uses the volume_from_F function:

  1. the volume_dir function in more general in that it can compute the equilibrium volume at any temperature and any pressure, but it requires the calculation of the pressure as the derivative of the Helmholtz function with respect to V; the computed volume is the one at which the total pressure of the crystal equals the imposed external pressure;

  2. the second method uses the volume_from_F function and computes the volume as the one that minimizes the Helmholtz free energy at the given temperature (and pressure zero); this is equivalent to the minimization of the Gibbs free energy, as the pressure is zero.

Of the other two methods,

  1. one uses the alpha_dir function that computes the volume in a small range of temperatures around the specified temperature, and subsequently makes a numerical derivative of the V(T) values (fitted by a given polynomials); whereas the other method

  2. computes the thermal expansion from the $K\alpha$ product, where $K$ (the bulk modulus) is from an EoS fit at the specified temperature, and

    $$K\alpha = \left(\frac{\partial P}{\partial T}\right)_V$$
    is computed from the numerical derivative of a polynomial representation of the P(T) function (the pressures at different temperatures are computed by using the corresponding EoS)

The method (4) heavily relies on the quality of the equation of state, whereas method (3) is EoS-free as the pressures needed for the calculation are directly computed as first derivatives of the Helmholtz function, through the pressure_dir function (note however that the static pressure contribution is always from a static EoS).

Appropriate values of the parameters controlling the quality of fits and derivates involved can be set by the control driver function (check the documentation provided); the default parameters should be suitable in the majority of cases (so, no commands must be issued), but in some other cases (the presence of soft-modes producing large thermal expansions, for instance) it might be useful to get acquainted with the volume_ctrl, volume_F_ctrl and delta_ctrl drivers:

Global information of (nearly) all of the parameters and settings involved in this particular case can be retrieved by the usual info.show command:

Let's compute the thermal expansion of pyrope in the [100, 400 K] T-range (12 points) by using all of the four methods illustrated above. The command is alpha_dir_v; the optional parameter comp is set to True (the default is False) to get the computation done with all the methods available; note that if comp is set to False, only the method (1), described above, is used.

In the figure above, the continuous line corresponds to the method (1); the full circles corresponds to the method (2); star and plus markers (barely visible in the specific case, as they overlap with the circles) corresponds to methods (3) and (4) respectively.

It is possible to compute the thermal expansion in a range of temperature (by the method (1) in the example below), fit it to a power serie and associate the coefficients of the fit to a given mineral in the database. First, compute the thermal expansion and make the fit, saving the coefficients in a given array (alpha_fit, for instance)

Second, load the alpha_fit coefficients in the database: for pyrope (py label) just issue the command:

Alternatively, in a single step, the phase can be specified by the optional argument phase:

Other functions for getting the coefficients of the power serie of the thermal expansion are available; for instance, for method (4):

Or the function alpha_dir_serie implementing the method (3):

Or yet the volume_from_F_serie implementing the method (2):

In summary, the four methods to compute thermal expansion are:

All of the four methods can also be applied with the single alpha_dir_v function by setting to True the comp parameter.