Representing FCs from external sources as a FCPΒΆ

There exist several codes that allow one to compute force constants and hiphive provides functionality to import some of these formats, including phonopy, phono3py, and thirdorder.py (ShengBTE). It can be convenient to represent these force constants as ForceConstantPotential objects, for example in order to enforce rotational sum rules.

Firstly these force constants have to be imported as a ForceConstants object. Secondly, one has to construct the ClusterSpace on which the force constants will be projected. Then one can obtain the parameters as follows:

from hiphive.utilities import extract_parameters
parameters = extract_parameters(fcs, cs)

Now a ForceConstantPotential can be created by combining the ClusterSpace and the parameters in the usual manner:

fcp = ForceConstantPotential(cs, parameters)

A minimal example can be found in
tests/integration/fcs_sensing.py

import numpy as np

from ase.build import bulk
from hiphive import ClusterSpace, ForceConstantPotential
from hiphive.utilities import extract_parameters

tol = 1e-12

cutoffs = [7, 5]
prim = bulk('Al')
dim = 6

ideal = prim.repeat(dim)

cs = ClusterSpace(prim, cutoffs)
parameters = np.random.random(cs.n_dofs)
fcp = ForceConstantPotential(cs, parameters)
fcs = fcp.get_force_constants(ideal)
fitted_parameters = extract_parameters(fcs, cs)

assert np.linalg.norm(fitted_parameters - parameters) < tol