Because of the large number of functionals available in Libxc, the way how it identifies functionals has become a de facto standard, as some codes and libraries also started using it.
Libxc has two ways of identifying a functional: using a string, which is called the functional name, or using an integer number, which is called the functional number.
The functional number is an integer that is set at the time of the implementation of the corresponding functional in the library and the only rules to select it are the following:
Once set, this number never changes and remains the same over all Libxc releases. Therefore, this is the preferred way of identifying a functional if backward compatibility is required. The disadvantage of using it is that it is not human-friendly, as, by itself, it conveys no information whatsoever about the functional.
The functional name is intended to be a human-readable string and, besides identifying the functional, it contains some information about it, like the family and kind. Note that this name might change between Libxc releases.
All the names have the following structure: XC_(FAMILY)_(KIND)_(SHORTNAME), with: